package com.ssy.lingxi.after.sale.utils;

import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;

/**
 * 编号工具类
 * @author 伍将
 * @date 2020/12/11
 * @version 2.0.0
 */
public class CodeUtils {

    // 32个字符，用来表示32进制
    final static char[] digits = {
            '0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'A', 'B',
            'C', 'D', 'E', 'F', 'G', 'H',
            'J', 'K', 'L', 'M', 'N', 'P',
            'Q', 'R', 'T', 'U', 'V', 'W',
            'X', 'Y'
    };

    /**
     * long类型转为32进制
     * @param val 需要转换的值
     * @param num 位数
     * @return
     */
    public static String digits32(String prefix, long val, int num) {
        // 32=2^5=二进制100000
        int shift = 5;
        // 此处mag=long值二进制减去高位0之后的长度
        int mag = Long.SIZE - Long.numberOfLeadingZeros(val);
        int len = Math.max(((mag + (shift - 1)) / shift), 1);
        char[] buf = new char[len];
        do {
            // &31相当于%32
            buf[--len] = digits[((int) val) & 31];
            val >>>= shift;
        } while (val != 0 && len > 0);
        //不足位数前面补0
        return prefix + StringUtils.leftPad(new String(buf), num, '0');
    }

    /**
     * 生成随机[大写]字母
     * @param length 长度
     * @return
     */
    public static String getRandomLetter(int length) {
        return RandomStringUtils.random(length, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    }

    /**
     * 生成随机数字
     * @param length 长度
     * @return
     */
    public static String getRandomNumber(int length) {
        return RandomStringUtils.random(length, "1234567890");
    }

    /**
     * 生成单号
     * @param prefix 前缀
     * @return prefix+2个字母+6位数字
     */
    public static String getInvoicesNo(String prefix) {
        return prefix.concat(getRandomLetter(2)).concat(getRandomNumber(6));
    }
}
